# -*- coding: utf-8 -*-

import os
import time
from pathlib import Path
import sys
import asyncio

import redis
import websockets

from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *

from TESS_PythonAPI.Tessng import TessInterface, TessPlugin, NetInterface, PyCustomerNet, Online, ILane, IConnector
from TESS_PythonAPI.Tessng import tessngPlugin, tessngIFace, m2p, p2m
from TESS_PythonAPI.Tessng import NetItemType, GraphicsItemPropName
from lon_lat_utils import lon_lat


# 用户插件子类，代表用户自定义与路网相关的实现逻辑，继承自MyCustomerNet
class MyNet(PyCustomerNet):
    def __init__(self):
        super(MyNet, self).__init__()
        self.r = redis.StrictRedis(host='localhost', port=6379, db=0, decode_responses=True)

    # 过载的父类方法，当打开网后TESS NG调用此方法
    #     实现的逻辑是：路网加载后获取路段数，如果路网数为0则调用方法createNet构建路网，之后再次获取路段数，如果大于0则启动仿真
    def afterLoadNet(self):
        # 代表TESS NG的接口
        iface = tessngIFace()
        # 代表TESS NG的路网子接口
        netiface = iface.netInterface()
        net = netiface.netAttrs()
        # 获取路段数
        count = netiface.linkCount()
        # lPoint 创建路段中心点
        road_point_data = []
        load_point_data = []

        # link = netiface.findLink(405)
        # if link is not None:
        #     # 路段中心线断点集
        #     lPoint = link.centerBreakPoints()
        #     print("一条路段中心线断点：", [(p.x(), p.y()) for p in lPoint])
        #     lLane = link.lanes()
        #     if lLane is not None and len(lLane) > 0:
        #         # 第一条车道中心线断点
        #         lPoint = lLane[0].centerBreakPoints()
        #         print("一条车道中心线断点：", [(p.x(), p.y()) for p in lPoint])

        # if (netiface.linkCount() > 0):
        #     # 所有路段
        #     lLink = netiface.links()
        #     for link in lLink:
        #         if link is not None:
        #             # 路段中心线断点集
        #             lPoint = link.centerBreakPoints()
        #             print("一条路段中心线断点：", [(p.x(), p.y()) for p in lPoint])
        #             lLane = link.lanes()
        #             if lLane is not None and len(lLane) > 0:
        #                 # 第一条车道中心线断点
        #                 lPoint = lLane[0].centerBreakPoints()
        #                 print("一条车道中心线断点：", [(p.x(), p.y()) for p in lPoint])
        #
        #     # lConnector = netiface.connectors()
        #     # for connector in lConnector:
        #     #     # "车道连接“断点集
        #     #     lPoint = connector.centerBreakPoints()
        #     #     print("一条'车道连接'中心线断点：", [(p.x(), p.y()) for p in lPoint])
        #
            # ID等于1的路段

        #     # 所有连接段
        #     lConnector = netiface.connectors()
        #     if lConnector is not None and len(lConnector) > 0:
        #         # 第一条连接段的所有“车道连接”
        #         lLaneConnector = lConnector[0].laneConnectors()
        #         # 其中第一条“车道连接”
        #         laneConnector = lLaneConnector[0]
        #         # "车道连接“断点集
        #         lPoint = laneConnector.centerBreakPoints()
        #         print("一条'车道连接'中心线断点：", [(p.x(), p.y()) for p in lPoint])

    # 是否允许用户对路网元素的绘制进行干预，如选择路段标签类型、确定绘制颜色等，本方法目的在于减少不必要的对python方法调用频次
    def isPermitForCustDraw(self):
        # 代表TESS NG的接口
        iface = tessngIFace()
        netface = iface.netInterface()
        count = netface.linkCount()

        print(count)
        netFileName = netface.netFilePath()
        if "Temp" in netFileName:
            return True
        else:
            return False

    ''' 过载的父类方法，在绘制路网元素时被调用，确定用ID或名称，以及字体大小绘制标签，也可确定不绘制标签
    itemType：NetItemType常量，代表不同类型路网元素
    itemId：路网元素的ID
    ref_outPropName：返回值，GraphicsItemPropName枚举类型，影响路段和连接段的标签是否被绘制
        GraphicsItemPropName。None_表示不绘制，GraphicsItemPropName。ID：表示绘制ID，GraphicsItemPropName。NAME:表示绘制名称
    ref_outFontSize，返回值，标签大小，单位：米。假设车道宽度是3.5米，如果ref_outFontSize.value等于7，绘制的标签大小占两个车道宽度
    '''

    def ref_labelNameAndFont(self, itemType, itemId, ref_outPropName, ref_outFontSize):
        # 代表TESS NG的接口
        iface = tessngIFace()
        # 代表TESS NG仿真子接口
        simuiface = iface.simuInterface()
        # 如果仿真正在进行，设置ref_outPropName.value等于GraphicsItemPropName.None_，路段和车道都不绘制标签
        if simuiface.isRunning():
            ref_outPropName.value = GraphicsItemPropName.None_
            return
        # 默认绘制ID
        ref_outPropName.value = GraphicsItemPropName.Id
        # 标签大小为6米
        ref_outFontSize.value = 6
        # 如果是连接段一律绘制名称
        if itemType == NetItemType.GConnectorType:
            ref_outPropName.value = GraphicsItemPropName.Name
        elif itemType == NetItemType.GLinkType:
            if itemId == 1 or itemId == 5 or itemId == 6:
                ref_outPropName.value = GraphicsItemPropName.Name

    # 过载父类方法，是否绘制车道中心线
    def isDrawLaneCenterLine(self, laneId):
        return True

    # 过载父类方法，是否绘制路段中心线
    def isDrawLinkCenterLine(self, linkId):
        if linkId == 1:
            return False
        else:
            return True
